4. 指令族语义
下表给出每个 unit 的共同语义;同一族的精确 opcode、操作数和例外由 YAML 中每条指令的 semantics 字段定义。
| unit | 语义范围 |
|---|---|
valu | 32-bit 整数加减、移位、比较、逻辑、乘法/高半乘法、MAC、饱和、位域、置换、点积;f*.f32 的 IEEE binary32 运算、符号注入、分类、转换、舍入和 packed f16/i16 运算。.vu/.vi/.m/.vl 变体分别使用 uniform、立即数、第三源或 literal;目的受 EXEC。 |
salu | 与整数 VALU 对应的 warp-uniform 运算、立即数和相对寄存器寻址;exec.*、saveexec.*、exec.wqm 修改/读取 EXEC,忽略 lane 掩码。 |
fp64 | binary64 基本运算、FMA、比较、分类、转换、指数/尾数分解;64-bit 结果使用偶数对齐 vpair,延迟 fixed:16。 |
sfu | rcp/rsq/sqrt/exp2/log2/sin/cos 及整数/浮点除法余数。采用迭代实现,按 async:sfu 计数;approx 指令的误差界在实现手册声明。 |
xlane | shfl(index/up/down/xor/rotate/broadcast)、quad swizzle、写 lane、导数、scan、ballot/vote、readfirst/readlane 和整数归约;读取其他 lane 时要求 cross_lane,结果归约到 uniform 时标 uniform_result。 |
branch | jmp、jal、jr/jalr 和 uniform 条件 bz/bnz/bany/bnone,以及按 EXEC 的 bexecz/bexecnz。控制转移是基本块边界,链接地址为当前指令地址加 4。 |
sync | sleep、warp/workgroup barrier、icache.inv 和 waitcnt。屏障要求参与 warp 到达同一动态实例;不满足会暂停而非静默继续。 |
lsu | global/ubase/buffer/shared/scratch 的标量宽度加载和存储;描述符寻址、cache policy、边界检查、向量与 uniform 载入;32/64-bit 原子、比较交换、自增减、浮点原子及 .rtn 返回旧值。 |
tex | tex.sample(隐式/显式 LOD、偏移、比较)、gather/fetch/query 和 img.load/store/atom。坐标/维度/分量掩码由 dim、dmask、a16、d16 指定,描述符在 u 中。 |
gfx | fragment interlock、透视/线性/平面插值、重心坐标、coverage/sample mask、helper/live、demote/discard、tile load/store 和 depth/stencil test。插值与 quad 读操作需 needs_wqm,仅片段有效的操作标 frag_only。 |
misc | nop、endpgm、trap、brk、setprio 和 CSR 读写/置位/清位。endpgm 终止 warp;trap 进入 CP 陷阱路径。 |
flags
YAML 中出现的每个 flag 都有以下精确定义,编译器不得删除其可观察效果:
| flag | 约束 |
|---|---|
exec_ignored | 独立于 EXEC 执行(uniform、控制或显式 lane 操作)。 |
reads_exec | 将 EXEC 作为数据输入。 |
writes_exec | 修改 EXEC。 |
ends_block | 可能转移控制或结束 warp,终止基本块。 |
branch | 立即数为从当前指令地址起算的 PC 相对字节偏移。 |
indirect | 使用 u 中的 32-bit code offset 间接跳转。 |
call | 将返回地址 PC+4 写入链接寄存器。 |
cond | 条件控制转移。 |
terminates | 结束整个 warp。 |
may_trap | 可能产生陷阱。 |
serializing | 等待之前固定延迟工作完成,后续指令可见其效果。 |
sync | 屏障、互锁或 waitcnt 同步。 |
load / store / atomic | 分别读、写、读改写内存。 |
cache_op | cache 维护操作。 |
bounds_checked | 描述符越界/null:load 返回 0,store/atomic 丢弃。 |
desc_based | 使用 u 中描述符;全零描述符为 null。 |
sparse_status | rsd=1 时额外返回 residency code,0 表示 resident。 |
fp_mode | 结果依赖 MODE。 |
rm_override | 有显式 rm,dyn 表示使用 MODE。 |
approx | 近似结果,误差要求写在具体语义中。 |
optional | 配置可不实现,驱动必须报告能力。 |
needs_wqm | 读取 2x2 quad 邻居,必须启用 whole-quad mode。 |
frag_only | 只允许 fragment/tile shader。 |
pair64 | 使用偶数对齐的 64-bit 寄存器对。 |
half16 | 操作 16-bit half。 |
uniform_result | 将 per-lane 数据归约到 uniform。 |
cross_lane | 读取其他 lane。 |
indexed_reg | 运行时计算寄存器号。 |